# 2021年1月18日星期一 上午8:47 周考2
# 人工智能学院1906A
# 裴云鹏


# 某糖果店目前有以下糖果种类、 价格和数量如下：
# 糖果种类 价格 数量
# 泡泡糖 5 12
# 巧克力糖 38 2
# Vc糖 44 4
# 咖啡糖 31 8
# 水果糖 16 6
#
# 1. 用合适的嵌套列表形式将以上内容进行保存。（5分）
# 2. 实现如下菜单界面：（5分）
# 3. 实现选项1功能（5分）
# 4. 实现选项2功能（5分）
# 5. 实现选项3功能（5分）
# 6. 实现选项4功能，增加一种糖果信息如下：（5分）
# 薄荷糖 22 5
# 7. 实现选项5功能，删除数量最少的糖果信息（5分）
# 8. 实现选项6功能，将巧克力糖果价格调整为48


import operator


xerror_prompt = '输入有误，请重新输入！'
xproducts_arr = [
    ['泡泡糖', 5, 12],
    ['巧克力糖', 38, 2],
    ['Vc糖', 44, 4],
    ['咖啡糖', 31, 8],
    ['水果糖', 16, 6]
]
xprompt = '''\
--------糖果管理系统--------
1.遍历查看所有糖果种类、价格和数量
2.按价格升序查看所有糖果
3.按数量降序查看所有糖果
4.增加糖果
5.删除糖果
6.修改糖果价格
'''


def input_value(xtype, xprompt, xerror_prompt=xerror_prompt):
    '''
    Common procedure to receive user's input.

    :param xtype: The expected type.
    :param xprompt: The prompt.
    :param xerror_prompt: The prompt when cannot parse user's input as the specified type
    :return: The very value user inputted.
    '''
    while True:
        xinput = input(xprompt).strip()
        try:
            xinput = xtype(xinput)
            if str == xtype and len(xinput) == 0:
                print('不能为空白，请重新输入。')
                continue
            return xinput
        except ValueError:
            print(xerror_prompt)
            continue


def show_products(products):
    '''
    Display detailed information of products in the command line.

    :param products: A nested list representing products
    :return: None
    '''
    xnumber = 1
    for xname, xprice, xcnt in products:
        print('#{number} {name} {price:.2f}元一件 库存{cnt}件'.format(number=xnumber, name=xname, price=xprice, cnt=xcnt))
        xnumber += 1


while True:
    print(xprompt)
    xchoice = input_value(int, '请选择功能序号：', '选择有误，请重新选择。')
    if not(1 <= xchoice <= 6):
        print('选择有误，请重新选择。')
        continue
    if 1 == xchoice:
        print('库存如下：')
        show_products(xproducts_arr)
        continue
    elif 2 == xchoice:
        xproduct_sorted = sorted(xproducts_arr, key=operator.itemgetter(1))
        print('按价格升序查看所有糖果：')
        show_products(xproduct_sorted)
        continue
    elif 3 == xchoice:
        xproduct_sorted = sorted(xproducts_arr, key=operator.itemgetter(2), reverse=True)
        print('按数量降序查看所有糖果：')
        show_products(xproduct_sorted)
        continue
    elif 4 == xchoice:
        print('添加糖果：')
        xname = input_value(str, '糖果名称？：')
        xprice = input_value(float, '糖果价格？：')
        xcnt = input_value(int, '糖果库存量？：')
        xproducts_arr.append([xname, xprice, xcnt])
        print('已经添加糖果‘{0}’，每件{1}元，库存{2}件'.format(xname, xprice, xcnt))
        continue
    elif 5 == xchoice:
        print('库存如下：')
        show_products(xproducts_arr)
        xlen = len(xproducts_arr)
        if xlen <= 0:
            print('没有数据可以供您删除！')
            continue
        xnumber = input_value(int, '请输入编号进行删除。')
        if not(1 <= xnumber <= xlen):
            print('您输入的编号不存在！删除失败')
        else:
            xproduct = xproducts_arr.pop(xnumber - 1)
            print('已经成功删除‘{}’的数据。'.format(xproduct[0]))
        continue
    elif 6 == xchoice:
        print('库存如下：')
        show_products(xproducts_arr)
        xlen = len(xproducts_arr)
        if xlen <= 0:
            print('没有数据可以供您修改！')
            continue
        xnumber = input_value(int, '您要需改哪个编号对应的糖果的价格？：')
        if not(1 <= xnumber <= xlen):
            print('您输入的编号不存在！修改失败')
        else:
            xproduct = xproducts_arr[xnumber - 1]
            xproduct[1] = input_value(float, '将‘{}’的价格改成多少？：'.format(xproduct[0]))
            print('已经成功修改‘{}’的数据。'.format(xproduct[0]))
        continue
    break

